package com.example.demo.common;

import cn.hutool.core.date.DateUtil;

import java.time.*;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author zhaiding
 * @since 2019-10-22
 */
public class DateUtils extends DateUtil {

    /**
     * 日期格式 yyyy
     */
    private static final String YEAR = "yyyy";
    /**
     * 日期格式 yyyy-MM
     */
    private static final String YEAR_MONTH = "yyyy-MM";

    private DateUtils() {
    }

    /**
     * 将特定格式的日期转换为Date对象
     *
     * @param dateStr 特定格式的日期 yyyy
     * @return 日期对象
     */
    public static Date parseYear(String dateStr) {
        return parse(dateStr, YEAR);
    }

    /**
     * 将特定格式的日期转换为Date对象
     *
     * @param dateStr 特定格式的日期 yyyy-MM
     * @return 日期对象
     */
    public static Date parseYearMonth(String dateStr) {
        return parse(dateStr, YEAR_MONTH);
    }

    /**
     * 转换的日期为 LocalTime
     *
     * @param date 被转换的日期
     * @return 转换后的 {@link LocalTime}
     */
    public static LocalTime dateToLocalTime(Date date) {
        if (null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
    }

    /**
     * 转换日期为 LocalDate
     *
     * @param date 被转换的日期
     * @return 转换后的 {@link LocalDate}
     */
    public static LocalDate dateToLocalDate(Date date) {
        if (null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * 转换日期为 LocalTime
     *
     * @param date 被转换的日期
     * @return 转换后的 {@link LocalDateTime}
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        if (null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }


    /**
     * 转换 localTime 为 Date
     *
     * @param localTime 被转换的日期
     * @return 转换后的 {@link Date}
     */
    public static Date localTimeToDate(LocalTime localTime) {
        if (null == localTime) {
            return null;
        }
        LocalDate localDate = LocalDate.now();
        LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
        return localDateTimetoDate(localDateTime);
    }

    /**
     * 转换 LocalDate 为 Date
     *
     * @param localDate 被转换的日期
     * @return 转换后的 {@link Date}
     */
    public static Date localDatetoDate(LocalDate localDate) {
        if (null == localDate) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    /**
     * 转换 LocalDateTime 为 Date
     *
     * @param localDateTime 被转换的日期
     * @return 转换后的 {@link Date}
     */
    public static Date localDateTimetoDate(LocalDateTime localDateTime) {
        if (null == localDateTime) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    /**
     * 将特定格式的日期转换为 LocalDateTime 对象
     *
     * @param dateStr 特定格式的日期 yyyy
     * @return 日期对象 {@link LocalDateTime}
     */
    public static LocalDateTime getLocalDateTime(String dateStr) {
        return dateToLocalDateTime(parseYear(dateStr));
    }

}